#include<iostream>
using namespace std;
int partition(int a[],int l,int r,int n){
    int m=a[l];
    int R=r;
    int L=l+1;
    while(L<=R){
        while(a[L]<=m&&L<=r)L++;
        while(a[R]>m)R--;
        if(L<R){
            swap(a[L],a[R]);
            L++;
            R--;
        }
    }
    swap(a[R],a[l]);
    for(int i=1;i<=n;i++){
        cout<<a[i]<<" ";
    }
    cout<<endl;
    return R;
}
void qsort(int a[], int l, int r, int n) {
// 边界条件：子数组为空或只有一个元素
if(l>=r)return;
    int k = partition(a, l, r, n);  // 分区操作
    qsort(a, l, k - 1, n);          // 递归排序左子数组
    qsort(a, k + 1, r, n);          // 递归排序右子数组
}
int main(){
    int n;
    cin>>n;
    int a[2000];
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    qsort(a,1,n,n);
    for(int i=1;i<=n;i++){
        cout<<a[i]<<" ";
    }
    return 0;
}
//快排：partition：选一个参照，一般第一个。
//从小到大：L<=m，l++,l<=r
//r>m,r--
//l<r,swap(l,r)
//return r;
//交换记得L++，R--；
//快排，分化。
//if(l>=r)return
//R=p，,(l,R-1),(R+1,r)